home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / audio / jukebox-extensions / source / prog-gui.c < prev   
C/C++ Source or Header  |  1995-08-25  |  11KB  |  469 lines

  1. /* JB-Prog-Gui -- macht die JukeBox programmierbar */
  2.  
  3. /* INCLUDE */
  4.  
  5. #include <exec/lists.h>
  6. #include <exec/memory.h>
  7. #include <intuition/intuition.h>
  8. #include <libraries/gadtools.h>
  9. #include <clib/alib_protos.h>
  10. #if defined(_DCC)
  11.   #include <clib/intuition_protos.h>
  12.   #include <clib/graphics_protos.h>
  13.   #include <clib/gadtools_protos.h>
  14.   #include <clib/exec_protos.h>
  15.   #include <clib/dos_protos.h>
  16. #else
  17.   #include <proto/intuition.h>
  18.   #include <proto/graphics.h>
  19.   #include <proto/gadtools.h>
  20.   #include <proto/exec.h>
  21.   #include <proto/dos.h>
  22. #endif
  23. #include <string.h>
  24.  
  25.  
  26. /* P R O T O T Y P E N */
  27.  
  28.  
  29. void WriteNumsToFile(void);
  30. struct Node *FindNodeNum(struct List *,UWORD);
  31. void ChangeRightGadget(void);
  32. void AddNodeRight(UWORD);
  33. void RemNodeRight(UWORD);
  34. void AdjustGadgets(void);
  35. int MakeGadgets(void);
  36. void RemoveGadgets(void);
  37. int MakeList(void);
  38. struct Node *MakeNode(char *);
  39. void ShowMsg(STRPTR);
  40.  
  41. #define POOLSIZE     4096
  42. #define TRESHSIZE    1024
  43.  
  44. #define DEFAULTIN  "t:jb.toc"
  45. #define DEFAULTOUT "t:jb.tracks"
  46. #define DEFAULTLEFT "Inhalt"
  47. #define DEFAULTRIGHT "gewählt"
  48. #define NOMEM        "Zuwenig Speicher!"
  49.  
  50. /* Globale Variablen und Strukturen */
  51.  
  52. const char VERSION[]="$VER: Prog-GUI V2.00ß by P. Kursawe 1995";
  53.  
  54. /* libnix specials */
  55.  
  56. int __nocommandline = 1;
  57. int __initlibraries = 1;
  58.  
  59. struct TagItem gg1tags[]={GTLV_Labels,0,TAG_DONE,0};
  60. struct TagItem gg2tags[]={GTLV_Labels,0,GTLV_Top,0,TAG_DONE,0};
  61.  
  62. struct GfxBase *GfxBase = NULL;
  63. struct IntuitionBase *IntuitionBase = NULL;
  64. struct Library *GadToolsBase=NULL;
  65. struct DosLibrary *DOSBase= NULL;
  66. struct Gadget *gg1ptr = NULL;
  67. struct Gadget *gg2ptr = NULL;
  68. struct Gadget *glistptr = NULL;
  69. struct Gadget *context = NULL;
  70. struct VisualInfo *vi = NULL;
  71. struct Gadget *dummygg = NULL;
  72. struct Window *mywindow = NULL;
  73. struct MinList Header1;
  74. struct MinList Header2;
  75. struct RDArgs *rdargs = NULL;
  76. LONG Kommandoparameter[] = {
  77.           (ULONG)DEFAULTIN,
  78.           (ULONG)DEFAULTOUT,
  79.           (ULONG)DEFAULTLEFT,
  80.           (ULONG)DEFAULTRIGHT};
  81.  
  82. APTR mempool;
  83.  
  84. struct NewGadget gadget1=
  85.             {
  86.              5,15,200,150,NULL,0,1,PLACETEXT_BELOW,0,0
  87.             };
  88. struct NewGadget gadget2=
  89.             {
  90.              210,15,200,150,NULL,0,2,PLACETEXT_BELOW,0,0
  91.             };
  92.  
  93. int _main()
  94. {
  95.  static struct TagItem wintags[]=
  96.                 {
  97.                  WA_Flags,WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_ACTIVATE,
  98.                  WA_Left,0,
  99.                  WA_Top,15,
  100.                  WA_MinWidth,100,
  101.                  WA_MinHeight,70,
  102.                  WA_MaxWidth,-1,
  103.                  WA_MaxHeight,-1,
  104.                  WA_Title,(ULONG)"JukeBox Programming Function",
  105.                  WA_Width,640,
  106.                  WA_Height,184,
  107.                  WA_IDCMP,IDCMP_CLOSEWINDOW|LISTVIEWIDCMP|IDCMP_NEWSIZE,
  108.                  TAG_DONE,0
  109.                 };
  110.  struct IntuiMessage *imsg;
  111.  struct Gadget *address;
  112.  ULONG imClass;
  113.  UWORD imCode;
  114.  
  115.  if((mempool=LibCreatePool(MEMF_CLEAR,POOLSIZE,TRESHSIZE)) == NULL)
  116.   return;
  117.  
  118.  NewList((struct List *)&Header1);
  119.  gg1tags[0].ti_Data=((ULONG)&Header1);
  120.  NewList((struct List *)&Header2);
  121.  gg2tags[0].ti_Data=((ULONG)&Header2);
  122.  
  123.  if((DOSBase=(struct DosLibrary*)OpenLibrary("dos.library",37L)))
  124.   {
  125.    if((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37L)))
  126.     {
  127.      if((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37L)))
  128.       {
  129.        if((GadToolsBase=OpenLibrary("gadtools.library",37L)))
  130.     {
  131.      /* hier sind alle Libraries offen */
  132.      rdargs=ReadArgs((STRPTR)"IN,OUT,LEFTTEXT,RIGHTTEXT",Kommandoparameter,NULL);
  133.      gadget1.ng_GadgetText=(UBYTE *)Kommandoparameter[2];
  134.      gadget2.ng_GadgetText=(UBYTE *)Kommandoparameter[3];
  135.      
  136.      if((mywindow=OpenWindowTagList(NULL,wintags)))
  137.       {
  138.        AdjustGadgets();
  139.        if((MakeList()))
  140.         {
  141.           if((MakeGadgets()))
  142.           {
  143.            for(;;)
  144.         {
  145.          if(Wait(1L<<mywindow->UserPort->mp_SigBit|SIGBREAKF_CTRL_C)&SIGBREAKF_CTRL_C)
  146.           break;
  147.          while((imsg=GT_GetIMsg(mywindow->UserPort)) != NULL)
  148.           {
  149.            imClass = imsg->Class;
  150.            imCode  = imsg->Code;
  151.            address = imsg->IAddress;
  152.            GT_ReplyIMsg(imsg);
  153.            switch(imClass)
  154.             {
  155.              case IDCMP_CLOSEWINDOW:
  156.               goto ende;
  157.              case IDCMP_GADGETUP:
  158.               if(address->GadgetID==1)
  159.                {
  160.                 AddNodeRight(imCode);
  161.                 break;
  162.                }
  163.               if(address->GadgetID==2)
  164.                {
  165.                 RemNodeRight(imCode);
  166.                 break;
  167.                }
  168.              case IDCMP_NEWSIZE:
  169.               RemoveGadgets();
  170.               AdjustGadgets();
  171.               MakeGadgets();
  172.              default:
  173.               break;
  174.             }
  175.           }
  176.         }
  177.     ende:
  178.            RemoveGadgets();
  179.            WriteNumsToFile();
  180.           }
  181.          else
  182.           {
  183.            ShowMsg("Konnte Gadgets nicht anlegen!\n");
  184.           }
  185.         }
  186.        else
  187.         {
  188.          ShowMsg("Konnte Listen nicht erstellen!\n");
  189.         }
  190.        CloseWindow(mywindow);
  191.       }
  192.           FreeArgs(rdargs);
  193.      /* alle Libraries schließen */
  194.      CloseLibrary(GadToolsBase);
  195.     }
  196.        else
  197.         {
  198.          ShowMsg("Kann gadtools.library nicht öffnen!\n");
  199.         }
  200.        CloseLibrary((struct Library *)IntuitionBase);
  201.       }
  202.      else
  203.       {
  204.        ShowMsg("Kann intuition.library nicht öffnen!\n");
  205.       }
  206.      CloseLibrary((struct Library *)GfxBase);
  207.     }
  208.    else
  209.     {
  210.      ShowMsg("Kann graphics.library nicht öffnen!\n");
  211.     }
  212.    CloseLibrary((struct Library *)DOSBase);
  213.   }
  214.   LibDeletePool(mempool);
  215.  return 0;
  216. }
  217.  
  218. /* -------------------------------------- */
  219. /*            UNTERROUTINEN               */
  220. /* -------------------------------------- */
  221.  
  222.  
  223. void WriteNumsToFile(void)
  224.  {
  225.   BPTR filehandle = NULL;
  226.   char fmt[] = "%u\n";
  227.   struct Node *node;
  228.   UWORD args[]={0};
  229.     
  230.   if((filehandle = Open((char *)Kommandoparameter[1],MODE_NEWFILE)))
  231.    {
  232.     node = Header2.mlh_Head;
  233.     while(node != (struct Node *)&Header2.mlh_Tail)
  234.      {
  235.       args[0] = node->ln_Type;
  236.       VFPrintf(filehandle,fmt,args);
  237.       node = node->ln_Succ;
  238.      }
  239.     Close(filehandle);
  240.    }
  241.   else
  242.    {
  243.     ShowMsg("Kann \"");
  244.     ShowMsg((char *)Kommandoparameter[1]);
  245.     ShowMsg("\"nicht öffnen!\n");
  246.    }
  247.  }
  248.  
  249.  
  250. struct Node *FindNodeNum(struct List * liste,UWORD Zahl)
  251.  {
  252.   struct Node * foundnode = NULL;
  253.   UWORD i;
  254.   if (IsListEmpty(liste))
  255.    return(foundnode);
  256.   foundnode = liste->lh_Head;
  257.   for(i=0; i<Zahl;i++)
  258.    {
  259.     if(foundnode->ln_Succ == NULL)
  260.      break;
  261.     foundnode = foundnode->ln_Succ;
  262.    } 
  263.   return(foundnode);
  264.  }
  265.  
  266. void AddNodeRight(UWORD Punkt)  /* Fügt eine Node (nummer x) ins rechte Gadget ein */
  267.  {
  268.   UBYTE tmpnum;
  269.   struct Node * nodetoclone = NULL;
  270.   if((nodetoclone = FindNodeNum((struct List *)&Header1,Punkt)))
  271.    {
  272.     tmpnum = nodetoclone->ln_Type;
  273.     nodetoclone = MakeNode(nodetoclone->ln_Name);
  274.     if((nodetoclone))
  275.      {
  276.       nodetoclone->ln_Type = tmpnum;
  277.       gg2tags[0].ti_Data=0L;
  278.       ChangeRightGadget();
  279.       AddTail(&Header2,nodetoclone);
  280.       gg2tags[1].ti_Data++;
  281.       gg2tags[0].ti_Data=(ULONG)&Header2;
  282.       ChangeRightGadget();
  283.      }
  284.    }
  285.  }
  286.  
  287. void RemNodeRight(UWORD Punkt)
  288.  {
  289.   struct Node * nodetoremove = NULL;
  290.   if((nodetoremove = FindNodeNum((struct List *)&Header2,Punkt)))
  291.    {
  292.     gg2tags[0].ti_Data=0L;
  293.     ChangeRightGadget();
  294.     Remove(nodetoremove);
  295.     gg2tags[1].ti_Data--;
  296.     gg2tags[0].ti_Data=(ULONG)&Header2;
  297.     ChangeRightGadget();
  298.     LibFreePooled(mempool,nodetoremove,sizeof(struct Node)+strlen(nodetoremove->ln_Name)+1);
  299.    }
  300.  }
  301.  
  302. void ChangeRightGadget(void)
  303.  {
  304.   GT_SetGadgetAttrsA(gg2ptr,mywindow,NULL,gg2tags);
  305.  }
  306.  
  307. void AdjustGadgets(void)
  308.  {
  309.   gadget1.ng_LeftEdge = mywindow->BorderLeft+5;
  310.   gadget1.ng_TopEdge  = mywindow->BorderTop+5;
  311.   gadget1.ng_Height   = mywindow->Height - mywindow->BorderBottom - 15 - gadget1.ng_TopEdge;
  312.   if(gadget1.ng_Height < 5)
  313.    {
  314.     gadget1.ng_Height = 5;
  315.    }
  316.   gadget2.ng_Height = gadget1.ng_Height;
  317.   gadget1.ng_Width    = ( (mywindow->Width - mywindow->BorderLeft - mywindow-> BorderRight - 15) / 2);
  318.    if(gadget1.ng_Width < 10)
  319.     {
  320.      gadget1.ng_Width = 10;
  321.     }
  322.   gadget2.ng_LeftEdge = gadget1.ng_Width + gadget1.ng_LeftEdge + 5;
  323.   gadget2.ng_TopEdge  = gadget1.ng_TopEdge;
  324.   gadget2.ng_Height   = gadget1.ng_Height;
  325.   gadget2.ng_Width    = gadget1.ng_Width;
  326.  }
  327.  
  328. /* Muß hier Gadgets belegen und einbinden. */
  329.  
  330. int MakeGadgets(void)
  331.  {
  332.  
  333.   int ret=FALSE;
  334.  
  335.   if((vi=GetVisualInfoA(mywindow->WScreen,NULL)))
  336.    {
  337.  
  338.     gadget1.ng_VisualInfo = vi;
  339.     gadget2.ng_VisualInfo = vi;
  340.  
  341.     if((dummygg=CreateContext(&glistptr)))
  342.      {
  343.       if((gg1ptr=CreateGadgetA(LISTVIEW_KIND,dummygg,&gadget1,gg1tags)))
  344.        {
  345.     if((gg2ptr=CreateGadgetA(LISTVIEW_KIND,gg1ptr,&gadget2,gg2tags)))
  346.      {
  347.       ret=TRUE;
  348.       EraseRect(mywindow->RPort,mywindow->BorderLeft,mywindow->BorderTop,mywindow->Width-mywindow->BorderRight-1,mywindow->Height-mywindow->BorderBottom-1);
  349.       AddGList(mywindow,glistptr,-1,-1,0);
  350.       RefreshWindowFrame(mywindow);
  351.       GT_RefreshWindow(mywindow,0);
  352.      }
  353.     else
  354.      {
  355.       FreeGadgets(glistptr);
  356.       glistptr = NULL;
  357.      }
  358.        }
  359.      }
  360.     else
  361.      {
  362.       FreeVisualInfo(vi);
  363.      }
  364.    }
  365.   return(ret);
  366.  }
  367.  
  368. void RemoveGadgets(void)
  369.  {
  370.   if((glistptr))
  371.    {
  372.     RemoveGList(mywindow,glistptr,-1);
  373.     FreeGadgets(glistptr);
  374.     FreeVisualInfo(vi);
  375.    }
  376.  }
  377.  
  378. int MakeList(void)
  379.  {
  380.   struct FileInfoBlock *fib = NULL;
  381.   struct Node *node=NULL;
  382.   BPTR filehandle = NULL;
  383.   BYTE *buffer;
  384.   BYTE *tempptr;
  385.   UBYTE TrackNum = 1;
  386.   int ret = FALSE;
  387.   LONG pos=0;
  388.  
  389.   if((fib=AllocDosObject(DOS_FIB,NULL)))
  390.    {
  391.     if((filehandle=Open((char *)Kommandoparameter[0],MODE_OLDFILE)))
  392.      {
  393.       if(DOSTRUE==ExamineFH(filehandle,fib))
  394.        {
  395.         if((buffer=LibAllocPooled(mempool,fib->fib_Size)))
  396.          {
  397.            Read(filehandle,buffer,fib->fib_Size);
  398.           /* Eigentliche Bearbeitung der Textdatei */
  399.        tempptr = buffer;
  400.        while(tempptr < buffer+fib->fib_Size) /* solange nicht über Ende hinaus*/
  401.         {
  402.          if((node=MakeNode((char *)tempptr)))
  403.           {
  404.            node->ln_Type = TrackNum;   /* Mißbraucht um die Tracknummer zu sichern! */
  405.            TrackNum++;
  406.            AddTail((struct List *)&Header1,node);
  407.           }
  408.          for(;tempptr[0] != 0;tempptr++)
  409.           {
  410.            /* Nix! */
  411.           }
  412.          tempptr++;
  413.         }
  414.         ret=TRUE;
  415.       LibFreePooled(mempool,buffer,fib->fib_Size);
  416.          }
  417.         else
  418.          {
  419.           ShowMsg(NOMEM);
  420.          }
  421.        }
  422.       else
  423.        {
  424.         ShowMsg("Examine fehlgeschlagen.\n");
  425.        }
  426.       Close(filehandle);
  427.      }
  428.     else
  429.      {
  430.       ShowMsg("Konnte \"");
  431.       ShowMsg((char *)Kommandoparameter[0]);
  432.       ShowMsg("\" nicht öffnen!\n");
  433.      }
  434.     FreeDosObject(DOS_FIB,fib);
  435.    }
  436.   else
  437.    {
  438.     ShowMsg("Konnte FileInfoBlock nicht belegen!\n");
  439.    }
  440.   return(ret);
  441.  }
  442.  
  443. /* Erzeugt stinknormale Nodes (mit Name dahinter, natürlich! */
  444.  
  445. struct Node *MakeNode(char string[])
  446.  {
  447.   struct Node *mem;
  448.  
  449.   if((mem=LibAllocPooled(mempool,sizeof(struct Node)+strlen(string)+1)))
  450.    {
  451.     mem->ln_Name=(char *)(mem+1);
  452.     strcpy((char *)(mem+1),string);
  453.    }
  454.   else
  455.    {
  456.     ShowMsg(NOMEM);
  457.    }
  458.   return(mem);
  459.  }
  460.  
  461. /* gibt nur ne Meldung aus ;) */
  462.  
  463. void ShowMsg(STRPTR msg)
  464.  {
  465.   PutStr(msg);
  466.  }
  467.  
  468.  
  469.